package vip.meeet.jdk.brige;

import java.lang.reflect.Method;

interface Base<T>{
    void doSomething(T data);//泛型擦除，T->Object
}

public class BrigeClass implements Base<String>{

    //接口参数的类型是Object的，所以实际不是重写，而是由编译器重写生成了一个
    //doSomething(Object) 调用了 doSomething(String)
    //doSomething(Object)就是桥接方法，可以使用javap -v 查看  ACC_BRIDGE, ACC_SYNTHETIC
    //还有一种情况是，重写的时候返回值是父类的子类也会生成桥接方法
    @Override
    public void doSomething(String data) {
        System.out.println(data);
    }

    public static void main(String[] args) throws Exception {
        BrigeClass brigeClass = new BrigeClass();
        Method func = BrigeClass.class.getMethod("doSomething", String.class);
        func.invoke(brigeClass, "alice");
        System.out.println(func.isBridge());
        func = BrigeClass.class.getMethod("doSomething", Object.class);
        func.invoke(brigeClass, "allen");
        System.out.println(func.isBridge());
    }
}
